<?php
/**
 * Ajax запрос.
 *<code>
 *<?php echo $this->ajaxHtml('/index/test')?>
 *</code>
 *
 * @author nrnwest@gmail.com
 * @uses viewHelper Arm_View_Helper
 */
class Arm_View_Helper_AjaxHtml extends Zend_View_Helper_Abstract
{
    

    /**
     * Тип возвращаемых данных
     *
     * @var string
     */
    private $_typeRe = null;

    /**
     * Метод запроса
     *
     * @var string
     */
    private $_method = null;


    /**
     * Флаг который укажет подключен сабж или нет
     *
     * @var boolean
     */
    private static  $_jquery = false;
    
    public function __construct()
    {
        if(self::$_jquery === false) {
            $this->view->headScript()->appendFile('/scripts/jquery/jquery.js');
        }
    }

    /**
    * Данный метод вызываеться в любом шаблоне вид следующим
    * образом $this->ajaxHtml('/', '#idName', array('еслиНужно'=>1));
    *
    * @param  string      $url
    * @param  string|null $id id html элемента здавать полный #example, .example елcли задать null то будет згенирован
    *                                 названия div с уникальным id вокруг вызываемого кода, и результат будет выведен
    *                                 в текущем месте вызова, потому если нужно дублировать результат вызова, можно
    *                                 использовать метод статический для получения id div и не выполнять допополнительный
    *                                 запрос ajax
    * @param  array       $params параметры в запрос к урлу если нужны
    * @param  array       $configQuery масив с асоциантивными ключами для форммирования
    *                            запросов по ajax
    *                            $configQuery['method']  = GET|POST
    *                            $configQuery['type']    = html|xml
    *
    * @return string готовый html или любой другой формат зданный в $configQuery['type']
    */
    public function ajaxHtml($url, $id=null, $params = array(), $configQuery = array())
    {
        $str = '';
        if($id !== null) {
           $this->_checkTarget($id);
        } else {
            $id   = self::getIdDiv($url);
            $str .= '<div id="' . $id . '"></div>';
            $id   = '#' . $id;
        }

        /**
         * Установка метода запроса
         */
        $this->_method = false === isset($configQuery['method']) ?
        'post' : $configQuery['method'];

        /**
         * Установка формата запроса
         */
        $this->_typeRe = false === isset($configQuery['type'])   ?
        'html' : $configQuery['type'];
        $str .= '<script language="JavaScript">' . $this->_ajaxResult($url, $params, $id) . '</script>';
        return $str;
    }
    
    protected function _ajaxResult($url, $params, $id)
    {
  $res = '
  $.ajax({
  type: "POST",
  url: "' . $url . '",
  data: "' . $this->_getParams($params) . '",
  cache: true,
  dataType: "html",
  success: function(html){
    $("' . $id . '").append(html);
  }
});';
        
  return $res;
    }


    /**
     * Вернет сформированный id для авто создаваемых div в системе
     * на основе $url, если параметер $returnDiv = true то вернет
     * сформированный html тега div
     *
     * @param  string $url
     * @param  boolean $returnDiv по умолчанию false возвращает только id
     * @return string
     */
    public static function getIdDiv($url, $returnDiv=false)
    {
        $id = strtolower(str_replace(array('/', '\\'), '', $url));
        if(strlen($id) === 0) {
            $id =  'index';
        }

        $id = 'ARM' . $id;
        if ($returnDiv === false) {
            return $id;
        }

        return  '<div id="' . $id . '"></div>';
    }


     /**
    * Вернет параметры в данные в формате: "name=John&location=Boston"
    * если же пустой масив поступил в метод будет возращен null
    *
    * @param  array $params масив который нужно передать в запрос.
    * @return string|null
    */
    protected function _getParams(array $params)
    {

        if ($params === array()) {
            return null;
        }

        $result = array();

        foreach ($params as $k=>$v) {
            $result[] = $k . '=' . $v;
        }

        return implode('&', $result);
    }


    /**
     * Проверит не заданна ли пустая строка для $target
     *
     * @throws Job_View_Exception если $target имеет нулевую длину.
     * @param string $target
     * @return boolean
     */
    protected function _checkTarget($target)
    {
        $target = trim($target);
        if (strlen($target)===0) {
            throw new Arm_Exception(Arm_Translate::_('Вы всегда долджны задавать клас или  id
            для вложения полуенных данных, иначе вы будете получать ошибку jquery'));
        }
        return true;
    }



    

    
    
}